﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Event_Planner.Models;

namespace Event_Planner.DataAccess
{
    public class Eventos
    {
        public EventPlannerContext db = new EventPlannerContext();

      
        public IEnumerable<EventosModels> EventosProximos()
        {
          var Eventos = from p in db.Eventos
                        where p.FechaFinalizacion > DateTime.Now
                        select p;
          return (Eventos.ToList());

        }

        public void EliminarEvento(EventosModels Evento)
        {
            if (Evento != null)
            {
                foreach (EventoConfirmacion eventoConfirmacion in Evento.ParticipantesEvento.ToList())
                {
                    db.Eventos.Find(Evento.ID).ParticipantesEvento.Remove(eventoConfirmacion);
                    db.Contactos.Find(eventoConfirmacion.Participante.ID).EventosParticipantes.Remove(eventoConfirmacion);
                }

                db.Eventos.Remove(db.Eventos.Find(Evento.ID));
                db.SaveChanges();
            }
        }



        public void EliminarEventosPropios(UsuariosModel Creador)
        {
            if (Creador != null)
            {
                foreach (EventosModels Evento in Creador.EventosCreados.ToList())
                    db.Eventos.Remove(db.Eventos.Find(Evento.ID));

                db.SaveChanges();
            }
        }


        public IEnumerable<EventosModels> BuscarEventos(string nombreEvento)
        {
            var query = from p in db.Eventos
                        where (p.NombreEvento.Contains(nombreEvento))
                        select p;

            return (query.ToList());

        }


        public void EliminarOrganizadoresDelEvento(int IDEvento)
        {
            EventosModels Evento = db.Eventos.Find(IDEvento);

            if (Evento != null)
            {
                if (Evento.OrganizadoresEvento.Count != 0)
                {
                    foreach (Event_Planner.Models.OrganizadoresModel Organizador in Evento.OrganizadoresEvento.ToList())
                        Evento.OrganizadoresEvento.Remove(Organizador);

                    db.SaveChanges();
                }
            }
        }


        public bool EsOrganizadoresDelEvento(int IDOrganizador ,int IDEvento)
        {
            ICollection<EventosModels> EventosOrganizados = db.Organizadores.Find(IDOrganizador).EventosOrganizados;

            bool Respuesta = false;

            foreach (EventosModels Evento in EventosOrganizados)
            {
                if (Evento.ID == IDEvento)
                    Respuesta = true;
            }

            return Respuesta;
        }


        public bool  EsParticipanteDelEvento(ContactosModel Participante, int IDEvento)
        {
            ICollection<EventoConfirmacion> EventosParticipantes = Participante.EventosParticipantes;

            bool Respuesta = false;

            foreach (EventoConfirmacion Evento in EventosParticipantes)
            {
                if (Evento.Evento.ID == IDEvento)
                    Respuesta = true;
            }

            return Respuesta;
        }

        public bool EstaConfirmadoParticipanteEvento(int IDParticipante, int IDEvento)
        {
            EventosModels Evento = db.Eventos.Find(IDEvento);

            ContactosModel Participante = db.Contactos.Find(IDParticipante);

            bool Respuesta = false;

            foreach (EventoConfirmacion eventoconfirmacion in Participante.EventosParticipantes)
            {
                if (eventoconfirmacion.Evento.ID == IDEvento)
                    Respuesta = eventoconfirmacion.Confirmacion;
            }

            return Respuesta;
        }


        public void EliminarParticipantesDelEvento(int IDEvento)
        {
            EventosModels Evento = db.Eventos.Find(IDEvento);

            ICollection<EventoConfirmacion> ListaParticipantes = Evento.ParticipantesEvento;

            if (ListaParticipantes.Count != 0)
            {
                foreach (EventoConfirmacion eventoConfirmacion in ListaParticipantes.ToList())
                {
                    Evento.ParticipantesEvento.Remove(eventoConfirmacion);
                    eventoConfirmacion.Participante.EventosParticipantes.Remove(eventoConfirmacion);
                }

                db.SaveChanges();
            }
        }



        public void EliminarConfirmacionParticipanteEvento(ContactosModel Participante, int IDEvento)
        {
            if (EsParticipanteDelEvento(Participante,IDEvento) == true)
            {
                foreach (EventoConfirmacion eventoConfirmacion in Participante.EventosParticipantes.ToList())
                {
                    if (eventoConfirmacion.Evento.ID == IDEvento)
                    {
                        db.Eventos.Find(IDEvento).ParticipantesEvento.Remove(eventoConfirmacion);
                        eventoConfirmacion.Participante.EventosParticipantes.Remove(eventoConfirmacion);
                    }

                }
                db.SaveChanges();
            }
            else throw new NullReferenceException();
        }


    }
}